package kuonjisai;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

	// 콜렉션 collection - 만능 동적 배열 짱짱맨 - 네에  우-후후...
	// 객체지향 기반 프로그램 작성시
	// 종종 같은 종류의 객체의 묶음group이나
	// 다른 종류의 객체묶음과 함께 스는때가 있음
	
	// 앞서 배운 배열은 같은 종류의 객체 묶음이지만
	// 유연성이 부족하고, 크기 조정도 안되고
	// 다른종류의 객체도 가질 수 없음
	
	// 다행히 자바에는 이러한 종류의 객체를 쉽게
	// 다룰 수 있는 인터페이스와 클래스를 제공
	// 그것은 바로 Collection 프레임 워크임
	// 대부분 java, util 패키지에 포진해 있음
	
	// collection은 다른 종류로 구성된 
	// 객체들의 묶음을 의미
	// 또 다른 말로 용기 container 라고도 하는데,
	// 각 요소를 저장, 검색, 조작하는 메서드를 제공
	
	// Collection <- Set, List, Queue
	// List <- ArrayList, Vector
	// Map <- AbstractMap, SortedMap
	// AbastractMap <- HashMap
	// Iterator, Comparator
	// 이들 대부분은 java.util 패키지에 포함됨
	
	// List
	// Collection의 가장 인기있는 하위 인터페이스임
	// ArrayList는 List의 가장 자주사용하는 구현클래스
	// LIst는 자료를 순서대로 저장하는 특성을 가짐
	// FIFO : first in first out 선입선출
	// 또한, 데이터를 중복으로 저장가능
	// 단, Set은 중복허용 불가!
	// add 메서드를 통해 데이터를 List의 맨끝에 추가
	
	// 지네릭 generic
	// collection 을 배울때 generic 을 빼놓으면
	// 불완전하게 collection을 배우는 것임
	
	
	// collection 을 사용할 때 발생할 수 있는
	// 컴파일 시간때 엄격한 자료형을 검사를 지원
	// 또한, collection 을 다룰때 대부분의
	// downcasting을 제거하고 사용할 수 있음
	// 또한, C++ 에서 제공하는 클래스 템플릿을
	// 작성할 수 있게해 줌 ( 고급 )
	
	// 지네릭에서는
	// 매개변수 자료형 pramaeterized type을 이용해서
	// collection 요소의 자료형을 지정함
	// 메서드의 매개변수는 ()안에 사용하는 것처럼
	// collection에서는 <>안에 매개변수자료형을 사용
	// List<String> result = null;
	
	
	public static void main(String[] args) {
			List a = new ArrayList(); 
			a.add(1111);
			a.add('a');
			a.add(1234.86321);
			a.add("야마마마이라ㅓㅁㄴㅇ;ㅣㅏ럼;ㄴ");
			a.add(new J03_MemberVO());
			// 죄다 가능함!!! 쩔어			!!!!!!!!!!!!!!			
			
			
			// ArrayList에 저장된 객체를 하나씩 꺼내 출력
			System.out.println( a. get(0) );
			System.out.println( a. get(1) );
			System.out.println( a. get(2) );
			System.out.println( a. get(3) );
			System.out.println( a. get(4) );
					
					
			// ArrayList에 저장된 객체를 하나씩 꺼내
			// 변수에 따로 저장
			// 이유 : ArrayList에 객체를 저장할"때는
			// 대상이 무엇이든간에 무조건 Object 형으로
			// 저장됨. 따라서, ArrayList에 저장된 객체를
			// 꺼낼때는 객체의 자료형에 맞춰 
			// downcasting이 필요 ( JDK 5 이전 ) 
			int num = (int) a.get(0);
			
			char ss = (char) a.get(1);
			float f = (float) a.get(2);
			String o = (String) a.get(3);
			
			// 하지만, 이렇게 해도 일단 오류는 X
			// 이런 종류의 오류는 찾기 힘듦
			char num2 = (char) a.get(0);				// int
			Integer intg = (Integer) a.get(3);			// String

			
			//int xyz = "abc"; 안e댐
			
			// 지네릭을 사용했을 경우
			List<String> abc = new ArrayList <String>();
			// List<String> abc = new ArrayList <>();			// JDK 1.7
			// abc라는 콜렉션(동적배열)에는
			// String 형식의 값만 추가할 수 있다는 의미
			
			
			// abc.add(123);
			// abc.add('a');
			abc.add("김태희");			// 정상처리
			
			String xdz = abc.get( 0 ); 	// 형변환은 필요x;
			
			
			List<J03_MemberVO> result = new ArrayList<J03_MemberVO>();
			List<J03_MemberVO> result2 = new ArrayList<>();
			
			
			
			
	} // main

	
	
     } // class






















